
  CREATE OR REPLACE PACKAGE BODY "SISTEMACADE"."MANEJOINVENTARIO" AS
    
    --FUNCION PARA AGREGAR UN EQUIPO MEDICO DE UNA ESPECIFICACION EXISTENTE
    PROCEDURE AGREGAREQUIPOMEDICO
        (SERIAL IN VARCHAR2, FECHAINGRESO IN DATE, FECHAVENCIMIENTO IN DATE, ESPECIFICACION IN VARCHAR2, PEDIDO IN NUMBER)
    IS
      ESTABLECIMIENTO NUMBER;
    BEGIN
      ESTABLECIMIENTO := ESTABLECIMIENTODEPEDIDO(PEDIDO => PEDIDO);
      INSERT INTO EQUIPO_MEDICO(NUMEROSERIALEM, FECHAINGRESO, FECHAEGRESO, FECHAVENCIMIENTO, PORCENTAJEUSO, MANTENIMIENTO, IDESPECIFICACIONEM, IDPEDIDO, IDESTABLECIMIENTO, MATRICULA) 
        VALUES(SERIAL, FECHAINGRESO, NULL, FECHAVENCIMIENTO, 0, 0, ESPECIFICACION, PEDIDO, ESTABLECIMIENTO, NULL);
      EXCEPTION 
        WHEN OTHERS THEN 
          DBMS_OUTPUT.PUT_LINE('ERROR DURANTE LA OPERACION.');
    END;
    
    --FUNCION PARA AGREGAR UN FARMACO DE UNA ESPECIFICACION EXISTENTE
    PROCEDURE AGREGARFARMACO
        (SERIAL IN NUMBER, FECHAVENCIMIENTO IN DATE, FECHAINGRESO IN DATE, ESPECIFICACION IN NUMBER, PEDIDO IN NUMBER)
    IS
      ESTABLECIMIENTO NUMBER;
    BEGIN
      ESTABLECIMIENTO := ESTABLECIMIENTODEPEDIDO(PEDIDO => PEDIDO);
      INSERT INTO FARMACO(NUMEROSERIALFARMACO, FECHAVENCIMIENTO, FECHAINGRESO, FECHAEGRESO, IDESPECIFICACIONFAR, IDCITA, IDPEDIDO, IDESTABLECIMIENTO, MATRICULA) 
        VALUES(SERIAL, FECHAVENCIMIENTO, FECHAINGRESO, NULL, ESPECIFICACION, NULL, PEDIDO, ESTABLECIMIENTO, NULL);
      DBMS_OUTPUT.PUT_LINE('FARMACO: '||SERIAL||' AGREGADO AL PEDIDO '|| PEDIDO);
      EXCEPTION 
        WHEN OTHERS THEN 
          DBMS_OUTPUT.PUT_LINE('ERROR DURANTE LA OPERACION.');
    END;
 
    --FUNCION PARA AGREGAR UN FARMACO DE UNA ESPECIFICACION EXISTENTE
    FUNCTION NUEVOPEDIDO
        (ESTABLECIMIENTO IN VARCHAR2, FECHA IN DATE, NOMBREPROVEEDOR IN VARCHAR2)
        RETURN NUMBER
    IS
      IDPEDIDO PEDIDO.IDPEDIDO%TYPE;
    BEGIN
      SELECT SEQ_IDPEDIDO.NEXTVAL INTO IDPEDIDO FROM DUAL;
      INSERT INTO PEDIDO(IDPEDIDO, CANTIDAD, FECHA, TIPO, NOMBREPROVEEDOR, IDESTABLECIMIENTOENTREGA, IDESTABLECIMIENTORECIBE) 
        VALUES(IDPEDIDO, NULL, FECHA, 'P', NOMBREPROVEEDOR, NULL, ESTABLECIMIENTO);
      DBMS_OUTPUT.PUT_LINE('SE AGREGO EL PEDIDO '|| IDPEDIDO || ' A CARGO DE ' || NOMBREPROVEEDOR);
      RETURN IDPEDIDO;
      EXCEPTION 
        WHEN OTHERS THEN 
          DBMS_OUTPUT.PUT_LINE('ERROR DURANTE LA OPERACION.');
    END;
    
    --FUNCION QUE RETORNA EL ESTABLECIMIENTO QUE RECIBE UN PEDIDO
    FUNCTION ESTABLECIMIENTODEPEDIDO
        (PEDIDO IN NUMBER)
        RETURN NUMBER
    IS
      ESTABLECIMIENTO NUMBER;
    BEGIN
      SELECT IDESTABLECIMIENTORECIBE INTO ESTABLECIMIENTO
      FROM PEDIDO
      WHERE IDPEDIDO = PEDIDO;
      RETURN ESTABLECIMIENTO;
      EXCEPTION 
        WHEN NO_DATA_FOUND THEN
          DBMS_OUTPUT.PUT_LINE('LOS DATOS NO EXISTEN O ESTAN CORRUPTOS.');
        WHEN OTHERS THEN 
          DBMS_OUTPUT.PUT_LINE('ERROR DURANTE LA OPERACION.');
    END;
    
    --FUNCION QUE REGISTRA UN PAGO, Y GENERA SU FACTURA
    PROCEDURE INGRESARPAGO
        (PEDIDO IN NUMBER, FECHA IN DATE, MONTO IN NUMBER)
    IS
      CURSOR PRODUCTOSFARM IS
        SELECT E.nombrecientifico, f.numeroserialfarmaco, f.fechaingreso, f.fechavencimiento
        FROM FARMACO F, ESP_FARMACO E
        WHERE F.idespecificacionfar = e.idespecificacionfar
        AND f.idpedido = PEDIDO;
      FILAFARM PRODUCTOSFARM%ROWTYPE;
      CURSOR PRODUCTOSEQU IS
        SELECT E.nombre, EM.numeroserialem, EM.fechaingreso, em.fechavencimiento
        FROM EQUIPO_MEDICO EM, ESP_EQUIPO_MEDICO E
        WHERE em.idespecificacionem = e.idespecificacionem
        AND EM.IDPEDIDO = PEDIDO;
      FILAEQU PRODUCTOSFARM%ROWTYPE;
      PROVEEDOR VARCHAR2(255);
    BEGIN
      SELECT P.nombreproveedor INTO PROVEEDOR
      FROM PEDIDO P
      WHERE P.IDPEDIDO = PEDIDO;
      DBMS_OUTPUT.PUT_LINE('PAGO A NOMBRE DE: '|| proveedor);
      DBMS_OUTPUT.PUT_LINE('FECHA: '|| FECHA); 
      DBMS_OUTPUT.PUT_LINE('LA CANTIDAD DE: '|| MONTO);
      DBMS_OUTPUT.PUT_LINE('POR CONCEPTO DE: ');
      DBMS_OUTPUT.PUT_LINE('FARMACOS: ');
      FOR FILAFARM IN PRODUCTOSFARM 
      LOOP 
        DBMS_OUTPUT.PUT_LINE(FILAFARM.nombrecientifico||' '||FILAFARM.numeroserialfarmaco||' '||FILAFARM.fechaingreso||' '||FILAFARM.fechavencimiento); 
      END LOOP; 
      DBMS_OUTPUT.PUT_LINE('EQUIPOS MEDICOS: ');
      FOR FILAEQU IN PRODUCTOSEQU
      LOOP 
        DBMS_OUTPUT.PUT_LINE(FILAEQU.nombre||' '||FILAEQU.numeroserialEM||' '||FILAEQU.fechaingreso||' '||FILAEQU.fechavencimiento); 
      END LOOP;
      
      EXCEPTION 
        WHEN NO_DATA_FOUND THEN
          DBMS_OUTPUT.PUT_LINE('LOS DATOS NO EXISTEN O ESTAN CORRUPTOS.');
        WHEN OTHERS THEN 
          DBMS_OUTPUT.PUT_LINE('ERROR DURANTE LA OPERACION.');
    END;
    
    --
    PROCEDURE RUTINADIAD
        (MATRICULA IN VARCHAR2, FECHA IN DATE)
    IS
    BEGIN
      NULL;
    END;

END MANEJOINVENTARIO;
/
 
